// ========================================================================
// Copyright (c) 2009 Intalio, Inc.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
// The Eclipse Public License is available at 
// http://www.eclipse.org/legal/epl-v10.html
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
// You may elect to redistribute this code under either of these licenses. 
// Contributors:
//    Hugues Malphettes - initial API and implementation
// ========================================================================
package org.eclipse.jetty.osgi.boot.warurl;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.jar.Manifest;

import org.eclipse.jetty.osgi.boot.warurl.internal.WarBundleManifestGenerator;
import org.eclipse.jetty.osgi.boot.warurl.internal.WarURLConnection;
import org.eclipse.jetty.util.URIUtil;
import org.osgi.service.url.AbstractURLStreamHandlerService;

/**
 * RFC-66: support for the "war" protocol
 * We are reusing the parsing of the query string from jetty.
 * If we wanted to not depend on jetty at all we could duplicate that method here
 */
public class WarUrlStreamHandler extends AbstractURLStreamHandlerService
{

    /**
     * @param url The url with a war scheme
     */
    @Override
    public URLConnection openConnection(URL url) throws IOException
    {
        //remove the war scheme.
        URL actual = new URL(url.toString().substring("war:".length()));
        
        //let's do some basic tests: see if this is a folder or not.
        //if it is a folder. we will try to support it.
        if (actual.getProtocol().equals("file"))
        {
            File file = new File(URIUtil.encodePath(actual.getPath()));
            if (file.exists())
            {
                if (file.isDirectory())
                {
                    //TODO (not mandatory for rfc66 though)
                }
            }
        }
        
      //  if (actual.toString().startsWith("file:/") && ! actual.to)
        URLConnection ori = (URLConnection) actual.openConnection();
        JarURLConnection jarOri = null;
        try {
            if (ori instanceof JarURLConnection)
            {
                jarOri = (JarURLConnection)ori;
            }
            else
            {
                jarOri = (JarURLConnection) new URL("jar:"+actual.toString() + "!/").openConnection();
            }
            Manifest mf = WarBundleManifestGenerator.createBundleManifest(
                    jarOri.getManifest(), url, jarOri.getJarFile());
            try { jarOri.getJarFile().close(); jarOri = null; } catch (Throwable t) {}
            return new WarURLConnection(actual,mf);
        }
        finally
        {
            if (jarOri != null) try { jarOri.getJarFile().close(); } catch (Throwable t) {}
        }
        
    }
    

}
